"""
数值处理工具模块
提供数值比较、转换等工具函数
"""


from typing import Any
from ..utils.logger import get_logger

logger = get_logger("driver.utils")


class NumericUtils:
    """
    数值处理工具类
    提供数值比较、转换等工具函数
    """

    @staticmethod
    def is_approximately_equal(value1: Any, value2: Any, rel_tol: float = 1e-5) -> bool:
        """
        判断两个值是否近似相等，对于数值类型使用相对误差比较

        Args:
            value1: 第一个值
            value2: 第二个值
            rel_tol: 相对误差容限

        Returns:
            bool: 如果近似相等返回True，否则返回False
        """
        # 如果类型不同，直接比较
        if type(value1) != type(value2):
            return value1 == value2

        # 对于浮点数类型，使用相对误差比较
        if isinstance(value1, (float, float)) and isinstance(value2, (float, float)):
            if value1 == value2:  # 处理相等和特殊值情况 (inf, -inf, nan)
                return True
            return abs(value1 - value2) <= rel_tol * max(abs(value1), abs(value2), 1e-9)

        # 对于整数类型，直接比较
        if isinstance(value1, int) and isinstance(value2, int):
            return value1 == value2

        # 其他类型直接比较
        return value1 == value2

    @staticmethod
    def compare_values(value1: Any, value2: Any, rel_tol: float = 1e-5) -> int:
        """
        比较两个值的大小

        Args:
            value1: 第一个值
            value2: 第二个值
            rel_tol: 浮点数比较的相对误差容限

        Returns:
            int: -1 如果value1 < value2, 0 如果value1 == value2, 1 如果value1 > value2
        """
        # 对于浮点数类型，使用近似比较
        if isinstance(value1, (float, float)) and isinstance(value2, (float, float)):
            if NumericUtils.is_approximately_equal(value1, value2, rel_tol):
                return 0
            elif value1 < value2:
                return -1
            else:
                return 1

        # 其他类型使用标准比较
        if value1 == value2:
            return 0
        elif value1 < value2:
            return -1
        else:
            return 1


# 创建全局函数，方便直接调用
def is_approximately_equal(value1: Any, value2: Any, rel_tol: float = 1e-5) -> bool:
    """
    判断两个值是否近似相等的便捷函数

    Args:
        value1: 第一个值
        value2: 第二个值
        rel_tol: 相对误差容限

    Returns:
        bool: 如果近似相等返回True，否则返回False
    """
    return NumericUtils.is_approximately_equal(value1, value2, rel_tol)


def compare_values(value1: Any, value2: Any, rel_tol: float = 1e-5) -> int:
    """
    比较两个值大小的便捷函数

    Args:
        value1: 第一个值
        value2: 第二个值
        rel_tol: 浮点数比较的相对误差容限

    Returns:
        int: -1 如果value1 < value2, 0 如果value1 == value2, 1 如果value1 > value2
    """
    return NumericUtils.compare_values(value1, value2, rel_tol)